package jmine.tec.hydra.send.impl.file;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import jmine.tec.hydra.HydraMessages;
import jmine.tec.hydra.api.HydraMessage;
import jmine.tec.hydra.domain.senderRegistry.FileSenderRegistry;
import jmine.tec.hydra.exception.HydraException;
import jmine.tec.hydra.send.Sender;
import jmine.tec.utils.io.IOUtils;

/**
 * Implementação de Sender para enviar mensagens para diretórios do sistema.
 * 
 * @author piercio
 */
public class FileSender implements Sender {

    private FileSenderRegistry registry;

    /**
     * Construtor.
     * 
     * @param registry o registro de envio.
     */
    public FileSender(FileSenderRegistry registry) {
        this.registry = registry;
    }

    /**
     * Envia a mensagem para um diretório destinatário.
     * 
     * @param message a {@link Mensagem} a ser enviada.
     */
    public void send(HydraMessage message) {
        String recipient = message.getSystem().getMnemonico();
        String action = message.getAction();
        String conversation = message.getConversation().getMnemonico();
        String idx = Integer.toString(message.getConversation().getMessages().indexOf(message));
        String fileName = String.format("%s-%s-%s-%s.%s", recipient, action, conversation, idx, this.registry.getExtension());
        String path = this.registry.getPath() + File.separator + fileName;
        try {
            this.write(new File(path), message.getBody());
        } catch (IOException e) {
            throw new HydraException(HydraMessages.SEND_FILE_ERROR.create(action, path), e);
        }

    }

    /**
     * @param registry o valor para o campo registry
     */
    public void setRegistry(FileSenderRegistry registry) {
        this.registry = registry;
    }

    /**
     * Escreve a mensagem no arquivo de saida.
     * 
     * @param file o arquivo de saida.
     * @param message a mensagem.
     * @throws IOException Erro ao manipular o arquivo.
     */
    public void write(File file, InputStream message) throws IOException {
        file.getParentFile().mkdirs();
        OutputStream out = new FileOutputStream(file);
        IOUtils.copyFully(message, out);
        out.flush();
        out.close();
    }
}